代码 > golang pprof记录

2021-07-07

mud 客户端有内存泄露,调试了一把,记录一下。

首先,引入 profile库

import "net/http/pprof"


然后合适的地方引入

runtime.SetBlockProfileRate(int(10 * time.Second))
runtime.SetMutexProfileFraction(int(10 * time.Second))
Router.Handle("/debug/pprof/").HandleFunc(pprof.Index)
Router.Handle("/debug/pprof/cmdline").HandleFunc(pprof.Cmdline)
Router.Handle("/debug/pprof/profile").HandleFunc(pprof.Profile)
Router.Handle("/debug/pprof/symbol").HandleFunc(pprof.Symbol)
Router.Handle("/debug/pprof/trace").HandleFunc(pprof.Trace)


SetBlockProfileRate是设置记录block的代码的值,单位是纳秒

SetMutexProfileFraction是设置记录锁起效代码的值。

然后打开debug/pprof页面



allocs
4	block
0	cmdline
17	goroutine
232	heap
0	mutex
0	profile
21	threadcreate
0	trace

其中重点关注的是 goroutine,heap,block几块

goroutine是看实时的goroutine数量和发起位置。如果不停增长,可能是泄露

heap是堆,数值是一直增长的。点入后看到的数据,建议加上gc=1参数强制gc一次

第一行的数字大概是

2: 58368 [2474: 8919408] @ heap/1048576


第二个数字58368是当前堆内存大小,最后一个数字1048576是最大使用的堆内存

然后是按当前使用内存大小的堆信息,大概是

1: 57344 [1: 57344]

第一个57344是当前使用的堆内存

方括号内的57344是最大使用过的堆内存。


点击登录